home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / putz / putzacti.i < prev    next >
Text File  |  1997-10-26  |  13KB  |  443 lines

  1. IMPLEMENTATION MODULE PutzAction;
  2.  
  3. (* In diesem Modul laufen die Ausgaben des Putzes zusammen
  4.  * Es wird ein Dialog in einem Fenster dargestellt, und
  5.  * die Ausgaben werden ber die Rechteckliste mit den 
  6.  * get&set-Modus von wind_update gemacht
  7.  *)
  8. FROM SYSTEM IMPORT ADDRESS, ADR, CADR, CAST, ASSEMBLER;
  9.  
  10. (* MM2-Module *)
  11.  
  12. IMPORT GrafBase;
  13.  
  14. (* CAT-Module *)
  15. IMPORT WdwManager, CatGlobal;
  16. FROM Void   IMPORT v;
  17.  
  18. (* Magic-Module *)
  19. IMPORT MagicSys, MagicAES, MagicStrings, mtUtils, mtAppl, mtAlerts, mtDials;
  20.  
  21. (* Putz-Module *)
  22. IMPORT Catputz2;
  23.  
  24.  
  25. CONST   puffStr = ' Puffere Dateien '+0C;
  26.         chkStr  = ' Prfe Nachrichten '+0C;
  27.         delStr  = ' L”sche Nachrichten '+0C;
  28.         linkStr = ' Verkettung neu aufbauen '+0C;
  29.         copyStr = ' Dateien umkopieren ' + 0C;
  30.         spaceStr= '                         '+0C;
  31.  
  32. VAR puffPtr,
  33.     chkPtr,
  34.     delPtr,
  35.     linkPtr,
  36.     copyPtr,
  37.     spacePtr : POINTER TO ARRAY [0..255] OF CHAR;
  38.  
  39. VAR rect : GrafBase.Rectangle;
  40.     inWindow: BOOLEAN;
  41.     wdwHandle: INTEGER;
  42.     oldNewTop: WdwManager.handleNewTopProc;
  43.     
  44.     actBox  : mtUtils.tObjcTree;
  45.     vr      : GrafBase.Rectangle;
  46.  
  47. PROCEDURE bProc (wdw, vdi : INTEGER; env : ADDRESS; mx, my : INTEGER; kstate, buts : BITSET; clicks :INTEGER): BOOLEAN;
  48. BEGIN
  49.   RETURN FALSE;
  50. END bProc;
  51.  
  52. PROCEDURE kProc (wdw, vdi : INTEGER; env: ADDRESS; taste: INTEGER; key, scan : CHAR; kstate : BITSET): BOOLEAN;
  53. BEGIN
  54.   RETURN FALSE
  55. END kProc;
  56.  
  57. PROCEDURE closeP (wdw, vdi: INTEGER; env : ADDRESS; force : BOOLEAN): BOOLEAN;
  58. BEGIN
  59.   RETURN force
  60. END closeP;
  61.  
  62. PROCEDURE topP (wdw, vdi: INTEGER; env: ADDRESS): BOOLEAN;
  63. BEGIN
  64.   RETURN TRUE
  65. END topP;
  66.  
  67. PROCEDURE untopP (wdw, vdi: INTEGER; env: ADDRESS);
  68. END untopP;
  69.  
  70. PROCEDURE setWork (wdw, vdi: INTEGER; env: ADDRESS; doc: GrafBase.LongRect; slided: BOOLEAN);
  71. END setWork;
  72.  
  73. PROCEDURE getRect (wdw, vdi: INTEGER; env: ADDRESS; VAR r : GrafBase.Rectangle);
  74. BEGIN
  75.   rect := r;
  76.   actBox^[0].obX := r.x;
  77.   actBox^[0].obY := r.y;
  78. END getRect;
  79.  
  80. PROCEDURE redrawInfo (wdw, vdi : INTEGER; env : ADDRESS; clip : GrafBase.Rectangle);
  81. BEGIN
  82.   mtDials.DialDraw (env, 0, 8, clip, TRUE);
  83. END redrawInfo;
  84.     
  85. PROCEDURE updateP (wdw, vdi: INTEGER; env: ADDRESS; doIt: BOOLEAN);
  86. BEGIN
  87.   IF doIt 
  88.   THEN 
  89.     MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  90.   ELSE
  91.     MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  92.   END;
  93. END updateP;
  94.  
  95. VAR slideVars : RECORD
  96.                   pFrame,
  97.                   sFrame    : mtUtils.tRect;
  98.                   lastWidth : INTEGER;
  99.                   reinit    : BOOLEAN;
  100.                   fullInit  : BOOLEAN;
  101.                   Epp       : LONGINT;
  102.                 END;
  103.     actParm   : RECORD
  104.                   msgTotal : LONGINT;
  105.                   msgDone  : INTEGER;
  106.                   actMode  : INTEGER;
  107.                 END;
  108.      
  109. PROCEDURE handleBusyMouse();
  110. BEGIN
  111.   IF ~CatGlobal.multiTask OR ~inWindow THEN 
  112.     IF WdwManager.IsOwnTop ()
  113.     THEN
  114.       CatGlobal.busyMouse; 
  115.     END;
  116.   END;
  117. END handleBusyMouse;
  118.  
  119. PROCEDURE DrawObjectInWdw (tree: ADDRESS; obj, depth: INTEGER; r: GrafBase.Rectangle; clip: BOOLEAN; mouse: BOOLEAN): BOOLEAN;
  120. BEGIN
  121.   IF ~clip
  122.   THEN 
  123.     mtUtils.CalcArea (tree, obj, r);
  124.   END;
  125.   IF inWindow
  126.   THEN
  127.     IF CatGlobal.multiTask
  128.     THEN
  129.       MagicAES.WindUpdate (MagicAES.BEGUPDATE+$100);
  130.     ELSE
  131.       MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  132.     END;
  133.     IF MagicAES.CallResult = 1
  134.     THEN
  135.       WdwManager.RedrawWdw (wdwHandle, r);
  136.       IF mouse
  137.       THEN
  138.         handleBusyMouse();
  139.       END;
  140.       MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  141.     ELSE
  142.       IF mouse THEN mtAppl.MouseArrow(); END;
  143.       RETURN FALSE
  144.     END;
  145.   ELSE
  146.     mtDials.DialDraw (tree, 0, depth, r, clip);
  147.   END;
  148.   RETURN TRUE;
  149. END DrawObjectInWdw;
  150.  
  151. PROCEDURE InitInfoSlider();
  152.   VAR tmp  : BITSET;
  153. BEGIN
  154.   WITH slideVars DO
  155.     (* slider anpassen an charWidth und charHeight *)
  156.     mtUtils.ObjcRect (actBox, Infobar, pFrame);
  157.     mtUtils.ObjcRect (actBox, Infoslid, sFrame);
  158.     (* Space berechnen *)
  159.     pFrame.h := mtAppl.CharHeight;
  160.     sFrame.h := mtAppl.CharHeight;
  161.     sFrame.w := 1;
  162.     Epp := (LONGINT(actParm.msgTotal*1000L) DIV LONG(pFrame.w));
  163.     mtUtils.SetObjcRect  (actBox, Infobar, pFrame);
  164.     mtUtils.SetObjcRect  (actBox, Infoslid, sFrame);
  165.     lastWidth := 0;
  166.     reinit := TRUE;
  167.     fullInit := TRUE;
  168.   END;
  169.   (* Fllstil auf Solid und Farbe setzen, falls Farbe *)
  170.   IF mtAppl.Bitplanes > 1
  171.   THEN
  172.     tmp := actBox^[Infoslid].obSpec.Box.flags;
  173.     tmp := tmp - {0..6} + {4..6} + {1};
  174.     actBox^[Infoslid].obSpec.Box.flags := tmp;
  175.   END;
  176. END InitInfoSlider;
  177.  
  178. PROCEDURE CalcInfoSlider (msgCount : LONGCARD);
  179.   VAR oldW : INTEGER;
  180.       r    : GrafBase.Rectangle;
  181.       startOb,
  182.       depth : INTEGER;
  183. BEGIN
  184.   WITH slideVars DO
  185.     WITH sFrame DO
  186.       IF Epp > 0
  187.       THEN
  188.         w := SHORT((VAL(LONGINT,msgCount)*1000L) DIV Epp);
  189.       ELSE
  190.         w := pFrame.w
  191.       END;
  192.       IF x+w > pFrame.w THEN w := pFrame.w END;
  193.       IF w<=0 THEN w := 1 END;
  194.       IF (lastWidth # w) OR reinit THEN
  195.         mtUtils.SetObjcRect  (actBox, Infoslid, sFrame);
  196.         mtUtils.ObjcArea (actBox, Infoslid, r);
  197.         IF ~reinit
  198.         THEN
  199.           r.x := r.x + lastWidth;
  200.           r.w := r.w - lastWidth + 1;
  201.         ELSE
  202.           mtUtils.ObjcArea (actBox, Infobar, r);
  203.         END;
  204.         IF fullInit THEN
  205.           startOb := 0;
  206.           depth := 8;
  207.           mtUtils.ObjcArea (actBox, 0, r);
  208.         ELSE
  209.           startOb := Infobar;
  210.           depth := 1;
  211.         END;
  212.         IF DrawObjectInWdw  (actBox, startOb, depth, r, TRUE, (msgCount+1) MOD 10 = 0)
  213.         THEN
  214.           lastWidth := sFrame.w;
  215.           reinit := FALSE;
  216.           fullInit := FALSE;
  217.         END;
  218.       END;
  219.     END;
  220.   END;
  221. END CalcInfoSlider;
  222.  
  223. PROCEDURE ReInitActionBox (REF grName : ARRAY OF CHAR; msgCount : LONGCARD);
  224. BEGIN
  225.   actParm.msgTotal := VAL(LONGINT,msgCount);
  226.   mtUtils.SetObjcString (actBox, Acgrname, '           ');
  227.   mtUtils.SetObjcString (actBox, Acpufsta, '                                           ');
  228.   mtUtils.SetObjcString (actBox, Acgrname, grName);
  229.   InitInfoSlider();
  230.   actParm.actMode := -1;
  231.   v.bool := DrawObjectInWdw (actBox, 0, 8, vr, FALSE, TRUE);
  232. END ReInitActionBox;
  233.  
  234. PROCEDURE BeginNextPass(mode: INTEGER); 
  235. BEGIN
  236.   InitInfoSlider();
  237.   actParm.actMode := mode;
  238.   CASE actParm.actMode OF
  239.       0       : mtUtils.SetObjcStringAdr (actBox, Acmsgid, puffPtr); |
  240.       1       : mtUtils.SetObjcStringAdr (actBox, Acmsgid, delPtr);  |
  241.       2       : mtUtils.SetObjcStringAdr (actBox, Acmsgid, linkPtr); |
  242.       3       : mtUtils.SetObjcStringAdr (actBox, Acmsgid, copyPtr); |
  243.       4       : mtUtils.SetObjcStringAdr (actBox, Acmsgid, chkPtr); |
  244.   ELSE
  245.     mtUtils.SetObjcStringAdr (actBox, Acmsgid, spacePtr);
  246.   END;
  247.   v.bool := DrawObjectInWdw (actBox, 0, 8, vr, FALSE, TRUE);
  248. END BeginNextPass;
  249.  
  250. PROCEDURE checkMouse (wdw: INTEGER);
  251.   VAR w, v : INTEGER;
  252. BEGIN
  253.   WdwManager.GetTopWindow (w, v);
  254.   IF ~WdwManager.IsOwnTop() & ~CatGlobal.multiTask
  255.   THEN
  256.     mtAppl.MouseArrow();
  257.   END;
  258. END checkMouse;
  259.  
  260. (* Init der Action-Box: Es werden alle notwendigen festen Strings berechnet,
  261.  * die variablen Strings werden gel”scht und die Box wird gezeichnet.
  262.  * Der Prozentbalken wird auf 0% gesetzt und auch gezeichnet
  263.  *)
  264. PROCEDURE InitActionBox ();
  265.   VAR full : GrafBase.Rectangle;
  266.       comps: BITSET;
  267.       oldFrame: CHAR;
  268. BEGIN
  269.   mtUtils.SetObjcString (actBox, Acgrname, '           ');
  270.   mtUtils.SetObjcString (actBox, Acpufsta, '                                           ');
  271.   mtUtils.SetObjcString (actBox, Acgrname, '            ');
  272.   InitInfoSlider();
  273.   (* Outlined abschalten und Rand auf 1 Pixel setzen *)
  274.   mtUtils.ExclFlag (actBox, 0, MagicAES.OUTLINED);
  275.   oldFrame := actBox^[0].obSpec.Box.frame;
  276.   actBox^[0].obSpec.Box.frame := CAST(CHAR, -1);
  277.   mtDials.DialCenter (actBox, mtDials.CSCREEN, 0, 0, rect);
  278.   mtUtils.ObjcArea (actBox, 0, rect);
  279.   (* Jetzt Fenster fr Box ”ffnen *)
  280.   comps := {MagicAES.NAME, MagicAES.MOVE};
  281.   MagicAES.WindCalc (MagicAES.WCBORDER, comps, rect, full);
  282.   IF full.y < WdwManager.deskSize.y THEN full.y := WdwManager.deskSize.y END;
  283.   IF full.x < WdwManager.deskSize.x THEN full.x := WdwManager.deskSize.x END;
  284.   IF WdwManager.OpenWindow (bProc, kProc, WdwManager.handleTimerProc (NIL), 
  285.                             full, full, comps, 
  286.                             FALSE, '', 'CATPUTZ', WdwManager.snapProc (NIL),
  287.                             closeP, redrawInfo, topP, 
  288.                             untopP, updateP, setWork, getRect, 
  289.                             WdwManager.hideProc(NIL), 0, actBox, 
  290.                             TRUE, TRUE, FALSE, FALSE, wdwHandle, v.int)
  291.   THEN
  292.     inWindow := TRUE;
  293.     WdwManager.FullRedrawWdw (wdwHandle);
  294.     oldNewTop := WdwManager.handleNewTop;
  295.     WdwManager.handleNewTop := checkMouse;
  296.   ELSE
  297.     inWindow := FALSE;
  298.     mtUtils.InclFlag (actBox, 0, MagicAES.OUTLINED);
  299.     actBox^[0].obSpec.Box.frame := oldFrame;
  300.     MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  301.     mtDials.DialCenter (actBox, mtDials.CSCREEN, 0, 0, rect);
  302.     mtDials.DialForm (actBox, mtDials.DSTART, rect, rect);
  303.     mtDials.DialDraw (actBox, 0, 5, rect, FALSE);
  304.   END;
  305.   handleBusyMouse();
  306. END InitActionBox;
  307.  
  308. PROCEDURE ShowBuffStatus (tabBuff, parBuff, datBuff : BOOLEAN);
  309.   VAR str : ARRAY [0..60] OF CHAR;
  310. BEGIN
  311.   str := 0C;
  312.   IF tabBuff
  313.   THEN
  314.     MagicStrings.Append ("TAB gepuffert", str);
  315.   END;
  316.   IF parBuff
  317.   THEN
  318.     IF tabBuff THEN MagicStrings.Append (", ", str) END;
  319.     MagicStrings.Append ("PAR gepuffert", str);
  320.   END;
  321.   IF datBuff
  322.   THEN
  323.     IF tabBuff OR parBuff THEN MagicStrings.Append (", ", str) END;
  324.     MagicStrings.Append ("DAT gepuffert", str);
  325.   END;
  326.   IF ~tabBuff & ~parBuff & ~datBuff
  327.   THEN
  328.     MagicStrings.Assign ("nichts gepuffert", str);
  329.   END;
  330.   mtUtils.SetObjcString (actBox, Acpufsta, str);
  331.   v.bool := DrawObjectInWdw (actBox, Acpufsta, 1, vr, FALSE, TRUE);
  332. END ShowBuffStatus;
  333.  
  334. PROCEDURE ReleaseActionBox();
  335. BEGIN
  336.   IF inWindow
  337.   THEN
  338.     inWindow := FALSE;
  339.     v.bool := WdwManager.CloseWindow (wdwHandle, TRUE);
  340.     wdwHandle := -1;
  341.     WdwManager.handleNewTop := oldNewTop;
  342.   ELSE
  343.     mtDials.DialForm (actBox, mtDials.DFINISH, rect, rect);
  344.     MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  345.   END;
  346.   mtUtils.SetObjcStringAdr (actBox, Acmsgid, spacePtr);
  347.   mtAppl.MouseArrow;
  348. END ReleaseActionBox;
  349.  
  350. VAR mess : ARRAY [0..15] OF INTEGER;
  351.  
  352. PROCEDURE setMultiParam();
  353. BEGIN
  354.   MagicAES.AESIntIn[0] := MagicSys.CastToInt (BITSET{MagicAES.MUMESAG, MagicAES.MUKEYBD, MagicAES.MUTIMER});
  355.   MagicAES.AESIntIn[14] := 0;
  356.   MagicAES.AESIntIn[15] := 0;
  357.   MagicAES.AESAddrIn[0] := ADR (mess);
  358. END setMultiParam;
  359.  
  360. PROCEDURE terminate(): BOOLEAN;
  361.   VAR event : BITSET;
  362.       key   : INTEGER;
  363.       scan  : INTEGER;
  364. BEGIN
  365.   setMultiParam();
  366.   event := MagicAES.EvntPmulti ();
  367.   IF MagicAES.MUMESAG IN event
  368.   THEN
  369.     v.bool := WdwManager.HandleEvent (event, mess, {}, {}, 0C, 0C, 0, 0, 0, 0);
  370.   END;
  371.   IF MagicAES.MUKEYBD IN event
  372.   THEN
  373.     key := MagicAES.AESIntOut[5];
  374.     ASSEMBLER
  375.       MOVE.W  key(A6),D0
  376.       LSR.W   #8,D0
  377.       MOVE.W  D0,scan(A6)
  378.     END;
  379.     IF (scan = 1) OR ((key MOD 255) = $1B)
  380.     THEN RETURN TRUE
  381.     END;
  382.   END;
  383.   RETURN FALSE
  384. END terminate;
  385.  
  386. PROCEDURE TellAction (actMode : INTEGER; msgCount : LONGCARD): BOOLEAN;
  387.   CONST stopAlert = "[2][Wollen Sie das L”schen|wirklich abbrechen?|Die aktuelle Gruppe|wird dann nicht mehr|weiter bearbeitet!][[Ja|[Nein]";
  388.   
  389.   VAR res : INTEGER;
  390. BEGIN
  391.   CalcInfoSlider(msgCount);
  392.   IF actMode # actParm.actMode
  393.   THEN
  394.     actParm.actMode := actMode;
  395.     mtUtils.SetObjcStringAdr (actBox, Acmsgid, spacePtr);
  396.     
  397.     v.bool := DrawObjectInWdw (actBox, Acmsgid, 1, vr, FALSE, FALSE);
  398.     CASE actMode OF
  399.         0       : mtUtils.SetObjcStringAdr (actBox, Acmsgid, puffPtr); |
  400.         1       : mtUtils.SetObjcStringAdr (actBox, Acmsgid, delPtr);  |
  401.         2       : mtUtils.SetObjcStringAdr (actBox, Acmsgid, linkPtr); |
  402.         3       : mtUtils.SetObjcStringAdr (actBox, Acmsgid, copyPtr); |
  403.         4       : mtUtils.SetObjcStringAdr (actBox, Acmsgid, chkPtr); |
  404.     ELSE
  405.       mtUtils.SetObjcStringAdr (actBox, Acmsgid, spacePtr);
  406.     END;
  407.     v.bool := DrawObjectInWdw (actBox, Acmsgid, 1, vr, FALSE, TRUE);
  408.   END;
  409.   IF terminate()
  410.   THEN
  411.     (* Sicherheitsabfrage *)
  412.     mtAppl.MouseArrow();
  413.     MagicAES.WindUpdate (MagicAES.BEGUPDATE);
  414.     mtAlerts.SetIconColor (MagicAES.BLUE);
  415.     res := mtAlerts.Alert (2, stopAlert);
  416.     mtAlerts.SetIconColor (MagicAES.BLACK);
  417.     MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  418.     IF res = 1
  419.     THEN
  420.       RETURN FALSE
  421.     END;
  422.     handleBusyMouse();
  423.   END;
  424.   RETURN TRUE
  425. END TellAction;
  426.  
  427.  
  428. PROCEDURE InitModule (tree: ADDRESS);
  429. (* Muž am Anfang aufgerufen werden, damit das Modul die Adresse 
  430.  * des Baumes hat
  431.  *)
  432. BEGIN
  433.   actBox := tree;
  434.   puffPtr := CADR(puffStr);
  435.   delPtr := CADR(delStr);
  436.   chkPtr := CADR(chkStr);
  437.   linkPtr := CADR(linkStr);
  438.   copyPtr := CADR(copyStr);
  439.   spacePtr := CADR(spaceStr);
  440. END InitModule;
  441.  
  442. END PutzAction.
  443.